package com.eliza.save.activity

import android.content.Context
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.EditText
import android.widget.TextView
import com.eliza.library.tools.InfoTools
import com.eliza.save.R
import java.io.OutputStreamWriter

/*
*
* 内部存储是指将应用程序的数据以文件方式存储到设备内存中。
* 以内部存储方式存储的文件属于其所创建的应用程序私有，其他应用程序无权进行操作。
* 当创建的应用程序被卸载时，其内部存储的文件也随之被删除。
* 当内部存储器的存储空间不足时，缓存文件可能会被删除以释放空间。
* */

/*
 * 常见高阶函数
 * fold函数：累加函数，与reduce方法类似，不过可以设置初始值，
 * 如果初始值可以是StringBuilder，可用来拼接字符串，
 * 参数acc的类型与初始值一致

* */
class InnerSavaActivity : AppCompatActivity() {
    private val context = this
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_inner_sava)
        /*
        * 绑定页面组件
        * */
        val tv_show = findViewById<TextView>(R.id.innerSave_textView)//显示数据
        val accout = findViewById<EditText>(R.id.innerSave_editText_accout)//输入帐号
        val pwd = findViewById<EditText>(R.id.innerSave_editText_pwd)//输入密码
        //   内部储存位置为  /data/data/com.eliza.save/files/IIII.txt

        val fileAllName = "IIII.txt" //文件名

        findViewById<Button>(R.id.innerSave_write_btn).setOnClickListener {
            val info = "accout：${accout.text} pwd:${pwd.text}"
            savaFile(fileAllName, info.toByteArray())
            InfoTools.ToastTools(context, "信息保存成功${info}")
        }
        findViewById<Button>(R.id.innerSave_read_btn).setOnClickListener {
            tv_show.text = readFile(fileAllName)
            InfoTools.ToastTools(context, "读取的文件内容${tv_show.text}")
        }
    }


/*
* 1)通过 Context.openFileOutput(String name, int mode) 方法打开文件并设定读写方式，
* 返回 FileOutputStream。
* 参数 mode 取值为：
        MODE_PRIVATE：默认访问方式，文件仅能被创建应用程序访问。
        MODE_APPEND：若文件已经存在，则在文件末尾继续写入数据，而不抹掉文件原有内容。
        MODE_WORLD_READABLE：允许该文件被其他应用程序执行读取内容操作。
        MODE_WORLD_WRITEABLE：允许该文件被其他应用程序执行写操作。
2) 调用 FileOutputStream.write() 方法写入数据。
3) 调用 FileOutputStream.close() 方法关闭输出流，完成写操作。
*
* */

    //    var files: Array<String> = context.fileList()//查看文件列表
    /**
     * Sava file
     * 文件全名称，要保存的数据
     * @param fileAllName
     * @param toSavaInfo
     */
    fun savaFile(fileAllName: String, toSavaInfo: ByteArray) {
        /*
        * kt 内部封装好的文件错误处理函数
        * */
        context.openFileOutput(fileAllName, Context.MODE_PRIVATE).use {
            it.write(toSavaInfo)
        }
    }

    /**
     * Read file
     * 要读取的文件路径
     * @param fileAllName
     * @return
     */
    fun readFile(fileAllName: String): String {
        val useLines = context.openFileInput(fileAllName).bufferedReader()
            .useLines { //读取所有数据作为行列表，并将其提供给回调。 最后关闭读者。
                    lines ->
                lines.fold("") { some, text ->
                    InfoTools.ToastTools(context, "${some.toString()}:${text.toString()}")
                    "$some\n$text"
                }
            }
        return useLines
    }


}